Better condition
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / preview / PreviewImageFragment.java
index 9d1cd60..938abf7 100644 (file)
@@ -202,12 +202,12 @@ public class PreviewImageFragment extends FileFragment {
     
     @Override
     public void onStop() {
-        super.onStop();
+        Log_OC.d(TAG, "onStop starts");
         if (mLoadBitmapTask != null) {
             mLoadBitmapTask.cancel(true);
             mLoadBitmapTask = null;
         }
-        
+        super.onStop();
     }
     
     /**
@@ -329,6 +329,8 @@ public class PreviewImageFragment extends FileFragment {
         if (mBitmap != null) {
             mBitmap.recycle();
             System.gc();
+                // putting this in onStop() is just the same; the fragment is always destroyed by the ViewPager
+                // when swipes further than the valid offset, and onStop() is never called before than that
         }
         super.onDestroy();
     }
@@ -391,6 +393,7 @@ public class PreviewImageFragment extends FileFragment {
             Bitmap result = null;
             if (params.length != 1) return result;
             String storagePath = params[0];
+            InputStream is = null;
             try {
 
                 if (isCancelled()) return result;
@@ -398,10 +401,9 @@ public class PreviewImageFragment extends FileFragment {
                 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))));
+                    // Decode file into a bitmap in real size for being able to make zoom on the image
+                    is = new FlushedInputStream(new BufferedInputStream(new FileInputStream(picture)));
+                    result = BitmapFactory.decodeStream(is);
                 }
 
                 if (isCancelled()) return result;
@@ -415,7 +417,7 @@ public class PreviewImageFragment extends FileFragment {
                 }
                 
             } catch (OutOfMemoryError e) {
-                Log_OC.e(TAG, "Out of memory occured for file " + storagePath, e);
+                Log_OC.w(TAG, "Out of memory rendering file " + storagePath + " in full size; scaling down");
 
                 if (isCancelled()) return result;
                 
@@ -439,6 +441,14 @@ public class PreviewImageFragment extends FileFragment {
                 mErrorMessageId = R.string.common_error_unknown;
                 Log_OC.e(TAG, "Unexpected error loading " + getFile().getStoragePath(), t);
                 
+            } finally {
+                if (is != null) {
+                    try {
+                        is.close();
+                    } catch (IOException e) {
+                        Log_OC.e(TAG, "Unexpected exception closing stream; trying to continue ", e);
+                    }
+                }
             }
             
             return result;
@@ -459,6 +469,10 @@ public class PreviewImageFragment extends FileFragment {
             } else {
                 showErrorMessage();
             }
+            if (mBitmap != null && mBitmap != result)  {
+                // unused bitmap, release it! (just in case)
+                result.recycle();
+            }
         }
         
         @SuppressLint("InlinedApi")
@@ -466,11 +480,10 @@ public class PreviewImageFragment extends FileFragment {
             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
+                    mBitmap  = result;  // needs to be kept for recycling when not useful
+                }
             }
             if (mMessageViewRef != null) {
                 final TextView messageView = mMessageViewRef.get();