package info.guardianproject.securereaderinterface.views; import info.guardianproject.securereaderinterface.uiutil.AnimationHelpers; import info.guardianproject.securereaderinterface.uiutil.UIHelpers; import info.guardianproject.iocipher.File; import android.content.Context; import android.graphics.Bitmap; import android.os.Handler; import android.util.AttributeSet; import android.util.Log; import android.widget.ImageView; import com.tinymission.rss.MediaContent; public class ImageMediaContentPreviewView extends ImageView implements MediaContentPreviewView { private MediaContent mMediaContent; private File mMediaFile; private Bitmap mRealBitmap; private Thread mSetImageThread; private Handler mHandler; private boolean mUseThisThread; public ImageMediaContentPreviewView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(context); } public ImageMediaContentPreviewView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public ImageMediaContentPreviewView(Context context) { super(context); initView(context); } private void initView(Context context) { this.setScaleType(ScaleType.CENTER_CROP); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { setBitmapIfDownloaded(); super.onLayout(changed, left, top, right, bottom); } @Override public void setImageBitmap(Bitmap bm) { // If we are setting the image from a different thread, make sure to // fade it in. // If we, however, set it from this thread (as we do when closing the // full screen mode // view) we want it to show immediately! if (bm != null && !mUseThisThread) AnimationHelpers.fadeOut(this, 0, 0, false); super.setImageBitmap(bm); if (bm != null && !mUseThisThread) AnimationHelpers.fadeIn(this, 500, 0, false); else if (bm != null) AnimationHelpers.fadeIn(this, 0, 0, false); } public void recycle() { setImageBitmap(null); if (mRealBitmap != null) { mRealBitmap.recycle(); mRealBitmap = null; } } private synchronized void setBitmapIfDownloaded() { if (mMediaFile != null && mRealBitmap == null && mSetImageThread == null) { if (mHandler == null && !mUseThisThread) mHandler = new Handler(); Runnable setImageRunnable = new Runnable() { @Override public void run() { int w = getWidth(); int h = getHeight(); Bitmap bmp = UIHelpers.scaleToMaxGLSize(getContext(), mMediaFile, w, h); Runnable doSetImageRunnable = new Runnable() { private Bitmap mBitmap; @Override public void run() { mRealBitmap = mBitmap; setImageBitmap(mRealBitmap); } private Runnable init(Bitmap bitmap) { mBitmap = bitmap; return this; } }.init(bmp); if (mUseThisThread) doSetImageRunnable.run(); else mHandler.post(doSetImageRunnable); } }; if (mUseThisThread) { setImageRunnable.run(); } else { mSetImageThread = new Thread(setImageRunnable); mSetImageThread.start(); } } } @Override protected int getSuggestedMinimumHeight() { if (mMediaContent != null && mRealBitmap == null) return mMediaContent.getHeight(); return super.getSuggestedMinimumHeight(); } @Override protected int getSuggestedMinimumWidth() { if (mMediaContent != null && mRealBitmap == null) return mMediaContent.getWidth(); return super.getSuggestedMinimumWidth(); } @Override public void setMediaContent(MediaContent mediaContent, File mediaFile, java.io.File mediaFileNonVFS, boolean useThisThread) { mMediaContent = mediaContent; mMediaFile = mediaFile; mUseThisThread = useThisThread; if (mMediaFile == null) { Log.v("ImageMediaContentPreviewView", "Failed to download media, no file."); return; } int w = getWidth(); int h = getHeight(); if (w > 0 && h > 0) { setBitmapIfDownloaded(); } } @Override public MediaContent getMediaContent() { return mMediaContent; } }