Merge branch 'develop' into navigation_drawer
authormasensio <masensio@solidgear.es>
Thu, 21 May 2015 07:46:59 +0000 (09:46 +0200)
committermasensio <masensio@solidgear.es>
Thu, 21 May 2015 07:46:59 +0000 (09:46 +0200)
Conflicts:
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

1  2 
src/com/owncloud/android/ui/preview/PreviewImageActivity.java
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@@ -32,11 -32,11 +32,11 @@@ import android.os.Handler
  import android.os.IBinder;
  import android.os.Message;
  import android.support.v4.view.ViewPager;
 +import android.support.v7.app.ActionBar;
 +import android.view.MenuItem;
  import android.view.View;
 +import android.view.Window;
  
 -import com.actionbarsherlock.app.ActionBar;
 -import com.actionbarsherlock.view.MenuItem;
 -import com.actionbarsherlock.view.Window;
  import com.ortiz.touch.ExtendedViewPager;
  import com.owncloud.android.R;
  import com.owncloud.android.authentication.AccountUtils;
@@@ -63,9 -63,9 +63,9 @@@ import com.owncloud.android.utils.Displ
  /**
   *  Holds a swiping galley where image files contained in an ownCloud directory are shown
   */
--public class PreviewImageActivity extends FileActivity implements 
-- FileFragment.ContainerActivity,
--ViewPager.OnPageChangeListener, OnRemoteOperationListener {
++public class PreviewImageActivity extends FileActivity implements
++        FileFragment.ContainerActivity,
++        ViewPager.OnPageChangeListener, OnRemoteOperationListener {
      
      public static final int DIALOG_SHORT_WAIT = 0;
  
  
      private void initViewPager() {
          // get parent from path
 -        String parentPath = getFile().getRemotePath().substring(0, getFile().getRemotePath().lastIndexOf(getFile().getFileName()));
 +        String parentPath = getFile().getRemotePath().substring(0,
 +                getFile().getRemotePath().lastIndexOf(getFile().getFileName()));
          OCFile parentFolder = getStorageManager().getFileByPath(parentPath);
          if (parentFolder == null) {
              // should not be necessary
              parentFolder = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
          }
 -        mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), getStorageManager());
 +        mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(),
 +                parentFolder, getAccount(), getStorageManager());
          mViewPager = (ExtendedViewPager) findViewById(R.id.fragmentPager);
 -        int position = mHasSavedPosition ? mSavedPosition : mPreviewImagePagerAdapter.getFilePosition(getFile());
 +        int position = mHasSavedPosition ? mSavedPosition :
 +                mPreviewImagePagerAdapter.getFilePosition(getFile());
          position = (position >= 0) ? position : 0;
          mViewPager.setAdapter(mPreviewImagePagerAdapter); 
          mViewPager.setOnPageChangeListener(this);
          mViewPager.setCurrentItem(position);
          if (position == 0 && !getFile().isDown()) {
 -            // this is necessary because mViewPager.setCurrentItem(0) just after setting the adapter does not result in a call to #onPageSelected(0) 
 +            // this is necessary because mViewPager.setCurrentItem(0) just after setting the
 +            // adapter does not result in a call to #onPageSelected(0)
              mRequestWaitingForBinder = true;
          }
      }
      }
      
      
 -    private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
 +    private void onUnshareLinkOperationFinish(UnshareLinkOperation operation,
 +                                              RemoteOperationResult result) {
          if (result.isSuccess()) {
              OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath());
              if (file != null) {
              
      }
      
 -    private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
 +    private void onCreateShareOperationFinish(CreateShareOperation operation,
 +                                              RemoteOperationResult result) {
          if (result.isSuccess()) {
              OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath());
              if (file != null) {
          @Override
          public void onServiceConnected(ComponentName component, IBinder service) {
                  
 -            if (component.equals(new ComponentName(PreviewImageActivity.this, FileDownloader.class))) {
 +            if (component.equals(new ComponentName(PreviewImageActivity.this,
 +                    FileDownloader.class))) {
                  mDownloaderBinder = (FileDownloaderBinder) service;
                  if (mRequestWaitingForBinder) {
                      mRequestWaitingForBinder = false;
 -                    Log_OC.d(TAG, "Simulating reselection of current page after connection of download binder");
 +                    Log_OC.d(TAG, "Simulating reselection of current page after connection " +
 +                            "of download binder");
                      onPageSelected(mViewPager.getCurrentItem());
                  }
  
 -            } else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) {
 +            } else if (component.equals(new ComponentName(PreviewImageActivity.this,
 +                    FileUploader.class))) {
                  Log_OC.d(TAG, "Upload service connected");
                  mUploaderBinder = (FileUploaderBinder) service;
              } else {
  
          @Override
          public void onServiceDisconnected(ComponentName component) {
 -            if (component.equals(new ComponentName(PreviewImageActivity.this, FileDownloader.class))) {
 +            if (component.equals(new ComponentName(PreviewImageActivity.this,
 +                    FileDownloader.class))) {
                  Log_OC.d(TAG, "Download service suddenly disconnected");
                  mDownloaderBinder = null;
 -            } else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) {
 +            } else if (component.equals(new ComponentName(PreviewImageActivity.this,
 +                    FileUploader.class))) {
                  Log_OC.d(TAG, "Upload service suddenly disconnected");
                  mUploaderBinder = null;
              }
          Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class);
          showDetailsIntent.setAction(FileDisplayActivity.ACTION_DETAILS);
          showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, file);
 -        showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
 +        showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT,
 +                AccountUtils.getCurrentOwnCloudAccount(this));
          startActivity(showDetailsIntent);
          int pos = mPreviewImagePagerAdapter.getFilePosition(file);
          file = mPreviewImagePagerAdapter.getFileAt(pos);
      }
  
      /**
 -     * This method will be invoked when a new page becomes selected. Animation is not necessarily complete.
 +     * This method will be invoked when a new page becomes selected. Animation is not necessarily
 +     * complete.
       * 
 -     *  @param  Position        Position index of the new selected page
 +     *  @param  position        Position index of the new selected page
       */
      @Override
      public void onPageSelected(int position) {
       * Called when the scroll state changes. Useful for discovering when the user begins dragging, 
       * when the pager is automatically settling to the current page. when it is fully stopped/idle.
       * 
 -     * @param   State       The new scroll state (SCROLL_STATE_IDLE, _DRAGGING, _SETTLING
 +     * @param   state       The new scroll state (SCROLL_STATE_IDLE, _DRAGGING, _SETTLING
       */
      @Override
      public void onPageScrollStateChanged(int state) {
      }
  
      /**
 -     * This method will be invoked when the current page is scrolled, either as part of a programmatically 
 -     * initiated smooth scroll or a user initiated touch scroll.
 +     * This method will be invoked when the current page is scrolled, either as part of a
 +     * programmatically initiated smooth scroll or a user initiated touch scroll.
       * 
       * @param   position                Position index of the first page currently being displayed. 
 -     *                                  Page position+1 will be visible if positionOffset is nonzero.
 +     *                                  Page position+1 will be visible if positionOffset is
 +     *                                  nonzero.
       *                                  
 -     * @param   positionOffset          Value from [0, 1) indicating the offset from the page at position.
 +     * @param   positionOffset          Value from [0, 1) indicating the offset from the page
 +     *                                  at position.
       * @param   positionOffsetPixels    Value in pixels indicating the offset from position. 
       */
      @Override
  
                  OCFile file = getStorageManager().getFileByPath(downloadedRemotePath);
                  int position = mPreviewImagePagerAdapter.getFilePosition(file);
 -                boolean downloadWasFine = intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false);
 -                //boolean isOffscreen =  Math.abs((mViewPager.getCurrentItem() - position)) <= mViewPager.getOffscreenPageLimit();
 +                boolean downloadWasFine = intent.getBooleanExtra(
 +                        FileDownloader.EXTRA_DOWNLOAD_RESULT, false);
 +                //boolean isOffscreen =  Math.abs((mViewPager.getCurrentItem() - position))
 +                // <= mViewPager.getOffscreenPageLimit();
                  
 -                if (position >= 0 && intent.getAction().equals(FileDownloader.getDownloadFinishMessage())) {
 +                if (position >= 0 &&
 +                        intent.getAction().equals(FileDownloader.getDownloadFinishMessage())) {
                      if (downloadWasFine) {
                          mPreviewImagePagerAdapter.updateFile(position, file);   
                          
                      } else {
                          mPreviewImagePagerAdapter.updateWithDownloadError(position);
                      }
 -                    mPreviewImagePagerAdapter.notifyDataSetChanged();   // will trigger the creation of new fragments
 +                    mPreviewImagePagerAdapter.notifyDataSetChanged();   // will trigger the creation
 +                                                                        // of new fragments
                      
                  } else {
                      Log_OC.d(TAG, "Download finished, but the fragment is offscreen");
   */
  package com.owncloud.android.ui.preview;
  
- import java.io.BufferedInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FilterInputStream;
- import java.io.IOException;
- import java.io.InputStream;
  import java.lang.ref.WeakReference;
  
  import android.accounts.Account;
  import android.annotation.SuppressLint;
  import android.app.Activity;
  import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.BitmapFactory.Options;
  import android.graphics.Point;
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.support.v4.app.FragmentStatePagerAdapter;
- import android.view.Display;
  import android.view.LayoutInflater;
 +import android.view.Menu;
 +import android.view.MenuInflater;
 +import android.view.MenuItem;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.view.ViewGroup;
@@@ -49,6 -37,9 +40,6 @@@ import android.widget.ImageView
  import android.widget.ProgressBar;
  import android.widget.TextView;
  
 -import com.actionbarsherlock.view.Menu;
 -import com.actionbarsherlock.view.MenuInflater;
 -import com.actionbarsherlock.view.MenuItem;
  import com.owncloud.android.R;
  import com.owncloud.android.datamodel.OCFile;
  import com.owncloud.android.files.FileMenuFilter;
@@@ -57,26 -48,25 +48,27 @@@ import com.owncloud.android.ui.dialog.C
  import com.owncloud.android.ui.dialog.RemoveFileDialogFragment;
  import com.owncloud.android.ui.fragment.FileFragment;
  import com.owncloud.android.utils.BitmapUtils;
+ import com.owncloud.android.utils.DisplayUtils;
  
  import third_parties.michaelOrtiz.TouchImageViewCustom;
  
  
  /**
   * This fragment shows a preview of a downloaded image.
-  * 
-  * Trying to get an instance with NULL {@link OCFile} or ownCloud {@link Account} values will
-  * produce an {@link IllegalStateException}.
++ *
++ * Trying to get an instance with a NULL {@link OCFile} will produce an
++ * {@link IllegalStateException}.
   * 
 - * Trying to get an instance with a NULL {@link OCFile} will produce an {@link IllegalStateException}.
 - * 
 - * If the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on instantiation too.
 + * If the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on
 + * instantiation too.
   */
  public class PreviewImageFragment extends FileFragment {
  
      public static final String EXTRA_FILE = "FILE";
-     public static final String EXTRA_ACCOUNT = "ACCOUNT";
  
-     private View mView;
-     private Account mAccount;
+     private static final String ARG_FILE = "FILE";
+     private static final String ARG_IGNORE_FIRST = "IGNORE_FIRST";
      private TouchImageViewCustom mImageView;
      private TextView mMessageView;
      private ProgressBar mProgressWheel;
      
      private LoadBitmapTask mLoadBitmapTask = null;
  
-     
      /**
-      * Creates a fragment to preview an image.
-      * 
-      * When 'imageFile' or 'ocAccount' are null
-      * 
-      * @param fileToDetail                 An {@link OCFile} to preview as an image in the fragment
-      * @param ocAccount                 An ownCloud account; needed to start downloads
+      * Public factory method to create a new fragment that previews an image.
+      *
 -     * Android strongly recommends keep the empty constructor of fragments as the only public constructor, and
++     * Android strongly recommends keep the empty constructor of fragments as the only public
++     * constructor, and
+      * use {@link #setArguments(Bundle)} to set the needed arguments.
+      *
+      * This method hides to client objects the need of doing the construction in two steps.
+      *
+      * @param imageFile                 An {@link OCFile} to preview as an image in the fragment
 -     * @param ignoreFirstSavedState     Flag to work around an unexpected behaviour of {@link FragmentStatePagerAdapter}
 +     * @param ignoreFirstSavedState     Flag to work around an unexpected behaviour of
-      *                                  {@link FragmentStatePagerAdapter}; TODO better solution
++     *                                  {@link FragmentStatePagerAdapter}
+      *                                  ; TODO better solution
       */
-     public PreviewImageFragment(OCFile fileToDetail, Account ocAccount,
-                                 boolean ignoreFirstSavedState) {
-         super(fileToDetail);
-         mAccount = ocAccount;
-         mIgnoreFirstSavedState = ignoreFirstSavedState;
 -    public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState) {
++    public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState){
+         PreviewImageFragment frag = new PreviewImageFragment();
+         Bundle args = new Bundle();
+         args.putParcelable(ARG_FILE, imageFile);
+         args.putBoolean(ARG_IGNORE_FIRST, ignoreFirstSavedState);
+         frag.setArguments(args);
+         return frag;
      }
      
      
      /**
       *  MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically
       *  (for instance, when the device is turned a aside).
       * 
 -     *  DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful construction 
 +     *  DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful
 +     *  construction
       */
      public PreviewImageFragment() {
-         super();
-         mAccount = null;
          mIgnoreFirstSavedState = false;
      }
      
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
 -            // TODO better in super, but needs to check ALL the class extending FileFragment; not right now
+         Bundle args = getArguments();
+         setFile((OCFile)args.getParcelable(ARG_FILE));
++            // TODO better in super, but needs to check ALL the class extending FileFragment;
++            // not right now
+         mIgnoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST);
          setHasOptionsMenu(true);
      }
      
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
          super.onCreateView(inflater, container, savedInstanceState);
-         mView = inflater.inflate(R.layout.preview_image_fragment, container, false);
-         mImageView = (TouchImageViewCustom) mView.findViewById(R.id.image);
+         View view = inflater.inflate(R.layout.preview_image_fragment, container, false);
+         mImageView = (TouchImageViewCustom) view.findViewById(R.id.image);
          mImageView.setVisibility(View.GONE);
          mImageView.setOnClickListener(new OnClickListener() {
              @Override
              }
  
          });
-         mMessageView = (TextView)mView.findViewById(R.id.message);
+         mMessageView = (TextView)view.findViewById(R.id.message);
          mMessageView.setVisibility(View.GONE);
-         mProgressWheel = (ProgressBar)mView.findViewById(R.id.progressWheel);
+         mProgressWheel = (ProgressBar)view.findViewById(R.id.progressWheel);
          mProgressWheel.setVisibility(View.VISIBLE);
-         return mView;
+         return view;
      }
  
      /**
          super.onActivityCreated(savedInstanceState);
          if (savedInstanceState != null) {
              if (!mIgnoreFirstSavedState) {
-                 OCFile file = (OCFile)savedInstanceState.getParcelable(
-                         PreviewImageFragment.EXTRA_FILE);
+                 OCFile file = savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_FILE);
                  setFile(file);
-                 mAccount = savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_ACCOUNT);
              } else {
                  mIgnoreFirstSavedState = false;
              }
          if (getFile() == null) {
              throw new IllegalStateException("Instanced with a NULL OCFile");
          }
-         if (mAccount == null) {
-             throw new IllegalStateException("Instanced with a NULL ownCloud Account");
-         }
          if (!getFile().isDown()) {
              throw new IllegalStateException("There is no local file to preview");
          }
      public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
          outState.putParcelable(PreviewImageFragment.EXTRA_FILE, getFile());
-         outState.putParcelable(PreviewImageFragment.EXTRA_ACCOUNT, mAccount);
      }
      
  
      public void onStart() {
          super.onStart();
          if (getFile() != null) {
-            mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
-            mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()});
+             mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
+             //mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()});
+             mLoadBitmapTask.execute(getFile().getStoragePath());
          }
      }
      
      
      @Override
      public void onStop() {
-         super.onStop();
+         Log_OC.d(TAG, "onStop starts");
          if (mLoadBitmapTask != null) {
              mLoadBitmapTask.cancel(true);
              mLoadBitmapTask = null;
          }
-         
+         super.onStop();
      }
      
      /**
                  getFile(),
                  mContainerActivity.getStorageManager().getAccount(),
                  mContainerActivity,
 -                getSherlockActivity()
 +                getActivity()
              );
              mf.filter(menu);
          }
          if (mBitmap != null) {
              mBitmap.recycle();
              System.gc();
 -                // {@link FragmentStatePagerAdapter} when the fragment in swiped further than the valid offscreen
 -                // distance, and onStop() is never called before than that
+                 // putting this in onStop() is just the same; the fragment is always destroyed by
++                // {@link FragmentStatePagerAdapter} when the fragment in swiped further than the
++                // valid offscreen distance, and onStop() is never called before than that
          }
          super.onDestroy();
      }
  
          /**
           * Weak reference to the target {@link ImageView} where the bitmap will be loaded into.
--         * 
 -         * Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before
 -         * the load finishes.
++         *
 +         * Using a weak reference will avoid memory leaks if the target ImageView is retired from
 +         * memory before the load finishes.
           */
          private final WeakReference<ImageViewCustom> mImageViewRef;
  
          /**
           * Weak reference to the target {@link TextView} where error messages will be written.
--         * 
 -         * Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before the
 -         * load finishes.
++         *
 +         * Using a weak reference will avoid memory leaks if the target ImageView is retired from
 +         * memory before the load finishes.
           */
          private final WeakReference<TextView> mMessageViewRef;
  
          /**
           * Weak reference to the target {@link ProgressBar} shown while the load is in progress.
           * 
 -         * Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before the load finishes.
 +         * Using a weak reference will avoid memory leaks if the target ImageView is retired from
 +         * memory before the load finishes.
           */
          private final WeakReference<ProgressBar> mProgressWheelRef;
  
           * 
           * @param imageView     Target {@link ImageView} where the bitmap will be loaded into.
           */
 -        public LoadBitmapTask(ImageViewCustom imageView, TextView messageView, ProgressBar progressWheel) {
 +        public LoadBitmapTask(ImageViewCustom imageView, TextView messageView,
 +                              ProgressBar progressWheel) {
              mImageViewRef = new WeakReference<ImageViewCustom>(imageView);
              mMessageViewRef = new WeakReference<TextView>(messageView);
              mProgressWheelRef = new WeakReference<ProgressBar>(progressWheel);
          @Override
          protected Bitmap doInBackground(String... params) {
              Bitmap result = null;
-             if (params.length != 1) return result;
+             if (params.length != 1) return null;
              String storagePath = params[0];
              try {
  
-                 if (isCancelled()) return result;
-                 
-                 File picture = new File(storagePath);
-                 if (picture != null) {
-                     // Decode file into a bitmap in real size for being able to make zoom on 
-                     // the image
-                     result = BitmapFactory.decodeStream(new FlushedInputStream
-                             (new BufferedInputStream(new FileInputStream(picture))));
+                 int maxDownScale = 3;   // could be a parameter passed to doInBackground(...)
+                 Point screenSize = DisplayUtils.getScreenSize(getActivity());
+                 int minWidth = screenSize.x;
+                 int minHeight = screenSize.y;
+                 for (int i = 0; i < maxDownScale && result == null; i++) {
+                     if (isCancelled()) return null;
+                     try {
 -                        result = BitmapUtils.decodeSampledBitmapFromFile(storagePath, minWidth, minHeight);
++                        result = BitmapUtils.decodeSampledBitmapFromFile(storagePath, minWidth,
++                                minHeight);
+                         if (isCancelled()) return result;
+                         if (result == null) {
+                             mErrorMessageId = R.string.preview_image_error_unknown_format;
+                             Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
+                             break;
+                         } else {
+                             // Rotate image, obeying exif tag.
+                             result = BitmapUtils.rotateImage(result, storagePath);
+                         }
+                     } catch (OutOfMemoryError e) {
+                         mErrorMessageId = R.string.common_error_out_memory;
+                         if (i < maxDownScale - 1) {
 -                            Log_OC.w(TAG, "Out of memory rendering file " + storagePath + " ; scaling down");
++                            Log_OC.w(TAG, "Out of memory rendering file " + storagePath +
++                                    " ; scaling down");
+                             minWidth = minWidth / 2;
+                             minHeight = minHeight / 2;
+                         } else {
 -                            Log_OC.w(TAG, "Out of memory rendering file " + storagePath + " ; failing");
++                            Log_OC.w(TAG, "Out of memory rendering file " + storagePath +
++                                    " ; failing");
+                         }
+                         if (result != null) {
+                             result.recycle();
+                         }
+                         result = null;
+                     }
                  }
  
-                 if (isCancelled()) return result;
-                 
-                 if (result == null) {
-                     mErrorMessageId = R.string.preview_image_error_unknown_format;
-                     Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
-                 } else {
-                     // Rotate image, obeying exif tag.
-                     result = BitmapUtils.rotateImage(result, storagePath);
-                 }
-                 
-             } catch (OutOfMemoryError e) {
-                 Log_OC.e(TAG, "Out of memory occured for file " + storagePath, e);
-                 if (isCancelled()) return result;
-                 
-                 // If out of memory error when loading or rotating image, try to load it scaled
-                 result = loadScaledImage(storagePath);
-                 if (result == null) {
-                     mErrorMessageId = R.string.preview_image_error_unknown_format;
-                     Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
-                 } else {
-                     // Rotate scaled image, obeying exif tag
-                     result = BitmapUtils.rotateImage(result, storagePath);
-                 }
-                     
              } catch (NoSuchFieldError e) {
                  mErrorMessageId = R.string.common_error_unknown;
                  Log_OC.e(TAG, "Error from access to unexisting field despite protection; file " 
              } else {
                  showErrorMessage();
              }
+             if (result != null && mBitmap != result)  {
+                 // unused bitmap, release it! (just in case)
+                 result.recycle();
+             }
          }
          
          @SuppressLint("InlinedApi")
          private void showLoadedImage(Bitmap result) {
-             if (mImageViewRef != null) {
-                 final ImageViewCustom imageView = mImageViewRef.get();
-                 if (imageView != null) {
-                     imageView.setBitmap(result);
-                     imageView.setImageBitmap(result);
-                     imageView.setVisibility(View.VISIBLE);
-                     mBitmap  = result;
-                 } // else , silently finish, the fragment was destroyed
-             }
-             if (mMessageViewRef != null) {
-                 final TextView messageView = mMessageViewRef.get();
-                 if (messageView != null) {
-                     messageView.setVisibility(View.GONE);
-                 } // else , silently finish, the fragment was destroyed
+             final ImageViewCustom imageView = mImageViewRef.get();
+             if (imageView != null) {
 -                Log_OC.d(TAG, "Showing image with resolution " + result.getWidth() + "x" + result.getHeight());
++                Log_OC.d(TAG, "Showing image with resolution " + result.getWidth() + "x" +
++                        result.getHeight());
+                 imageView.setImageBitmap(result);
+                 imageView.setVisibility(View.VISIBLE);
+                 mBitmap  = result;  // needs to be kept for recycling when not useful
              }
+             final TextView messageView = mMessageViewRef.get();
+             if (messageView != null) {
+                 messageView.setVisibility(View.GONE);
+             } // else , silently finish, the fragment was destroyed
          }
          
          private void showErrorMessage() {
-             if (mImageViewRef != null) {
-                 final ImageView imageView = mImageViewRef.get();
-                 if (imageView != null) {
-                     // shows the default error icon
-                     imageView.setVisibility(View.VISIBLE);
-                 } // else , silently finish, the fragment was destroyed
-             }
-             if (mMessageViewRef != null) {
-                 final TextView messageView = mMessageViewRef.get();
-                 if (messageView != null) {
-                     messageView.setText(mErrorMessageId);
-                     messageView.setVisibility(View.VISIBLE);
-                 } // else , silently finish, the fragment was destroyed
-             }
+             final ImageView imageView = mImageViewRef.get();
+             if (imageView != null) {
+                 // shows the default error icon
+                 imageView.setVisibility(View.VISIBLE);
+             } // else , silently finish, the fragment was destroyed
+             final TextView messageView = mMessageViewRef.get();
+             if (messageView != null) {
+                 messageView.setText(mErrorMessageId);
+                 messageView.setVisibility(View.VISIBLE);
+             } // else , silently finish, the fragment was destroyed
          }
          
          private void hideProgressWheel() {
-             if (mProgressWheelRef != null) {
-                 final ProgressBar progressWheel = mProgressWheelRef.get();
-                 if (progressWheel != null) {
-                     progressWheel.setVisibility(View.GONE);
-                 }
+             final ProgressBar progressWheel = mProgressWheelRef.get();
+             if (progressWheel != null) {
+                 progressWheel.setVisibility(View.GONE);
              }
          }
          
      }
  
      /**
 -     * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment} to be previewed.
 +     * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment}
 +     * to be previewed.
       * 
       * @param file      File to test if can be previewed.
       * @return          'True' if the file can be handled by the fragment.
          return mImageView;
      }
  
-     static class FlushedInputStream extends FilterInputStream {
-         public FlushedInputStream(InputStream inputStream) {
-         super(inputStream);
-         }
-         @Override
-         public long skip(long n) throws IOException {
-             long totalBytesSkipped = 0L;
-             while (totalBytesSkipped < n) {
-                 long bytesSkipped = in.skip(n - totalBytesSkipped);
-                 if (bytesSkipped == 0L) {
-                       int byteValue = read();
-                       if (byteValue < 0) {
-                           break;  // we reached EOF
-                       } else {
-                           bytesSkipped = 1; // we read one byte
-                       }
-                }
-                totalBytesSkipped += bytesSkipped;
-             }
-             return totalBytesSkipped;
-         }
-     }
-     /**
-      * Load image scaled
-      * @param storagePath: path of the image
-      * @return Bitmap
-      */
-     @SuppressWarnings("deprecation")
-     private Bitmap loadScaledImage(String storagePath) {
-         Log_OC.d(TAG, "Loading image scaled");
-         // set desired options that will affect the size of the bitmap
-         BitmapFactory.Options options = new Options();
-         options.inScaled = true;
-         options.inPurgeable = true;
-         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
-             options.inPreferQualityOverSpeed = false;
-         }
-         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
-             options.inMutable = false;
-         }
-         // make a false load of the bitmap - just to be able to read outWidth, outHeight and
-         // outMimeType
-         options.inJustDecodeBounds = true;
-         BitmapFactory.decodeFile(storagePath, options);
-         int width = options.outWidth;
-         int height = options.outHeight;
-         int scale = 1;
-         Display display = getActivity().getWindowManager().getDefaultDisplay();
-         Point size = new Point();
-         int screenWidth;
-         int screenHeight;
-         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {
-             display.getSize(size);
-             screenWidth = size.x;
-             screenHeight = size.y;
-         } else {
-             screenWidth = display.getWidth();
-             screenHeight = display.getHeight();
-         }
-         if (width > screenWidth) {
-             // second try to scale down the image , this time depending upon the screen size 
-             scale = (int) Math.floor((float)width / screenWidth);
-         }
-         if (height > screenHeight) {
-             scale = Math.max(scale, (int) Math.floor((float)height / screenHeight));
-         }
-         options.inSampleSize = scale;
-         // really load the bitmap
-         options.inJustDecodeBounds = false; // the next decodeFile call will be real
-         return BitmapFactory.decodeFile(storagePath, options);
-     }
  }