import com.owncloud.android.lib.common.utils.Log_OC;
public class ImageViewCustom extends ImageView {
-
+
+ private static final String TAG = ImageViewCustom.class.getSimpleName();
+
private static final boolean IS_ICS_OR_HIGHER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
-
- private Bitmap mBitmap;
+
+ private int mBitmapHeight;
+ private int mBitmapWidth;
public ImageViewCustom(Context context) {
/**
* Checks if current bitmaps exceed the maximum OpenGL texture size limit
- * @param bitmap
- * @return boolean
+ * @param canvas Canvas where the view will be drawn into.
+ * @return boolean True means that the bitmap is too big for the canvas.
*/
@SuppressLint("NewApi")
private boolean checkIfMaximumBitmapExceed(Canvas canvas) {
- Log_OC.d("OC", "Canvas maximum: " + canvas.getMaximumBitmapWidth() + " - " + canvas.getMaximumBitmapHeight());
- if (mBitmap!= null && (mBitmap.getWidth() > canvas.getMaximumBitmapWidth()
- || mBitmap.getHeight() > canvas.getMaximumBitmapHeight())) {
+ Log_OC.v(TAG, "Canvas maximum: " + canvas.getMaximumBitmapWidth() + " - " + canvas.getMaximumBitmapHeight());
+ if (mBitmapWidth > canvas.getMaximumBitmapWidth()
+ || mBitmapHeight > canvas.getMaximumBitmapHeight()) {
return true;
}
return false;
}
+ @Override
/**
- * Set current bitmap
- * @param bitmap
+ * Keeps the size of the bitmap cached in member variables for faster access in {@link #onDraw(Canvas)} ,
+ * but without keeping another reference to the {@link Bitmap}
*/
- public void setBitmap (Bitmap bitmap) {
- mBitmap = bitmap;
+ public void setImageBitmap (Bitmap bm) {
+ mBitmapWidth = bm.getWidth();
+ mBitmapHeight = bm.getHeight();
+ super.setImageBitmap(bm);
}
}
@Override
public void onStop() {
- super.onStop();
+ Log_OC.d(TAG, "onStop starts");
if (mLoadBitmapTask != null) {
mLoadBitmapTask.cancel(true);
mLoadBitmapTask = null;
}
-
+ super.onStop();
}
/**
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();
}
}
} 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;
} else {
showErrorMessage();
}
+ if (mBitmap != result) {
+ // unused bitmap, release it! (just in case)
+ result.recycle();
+ }
}
@SuppressLint("InlinedApi")
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();