From 754de6bb0449a577d2bb9c28cca6adf0ef9554f6 Mon Sep 17 00:00:00 2001 From: steckbrief Date: Mon, 6 Feb 2017 10:01:13 +0100 Subject: relates FS#241: Implementation of http download based on okhttp --- .../conversationsplus/utils/ImageUtil.java | 136 +++++++++++++++++++++ 1 file changed, 136 insertions(+) (limited to 'src/main/java/de/thedevstack/conversationsplus/utils/ImageUtil.java') diff --git a/src/main/java/de/thedevstack/conversationsplus/utils/ImageUtil.java b/src/main/java/de/thedevstack/conversationsplus/utils/ImageUtil.java index 0b8ace95..eee18cc9 100644 --- a/src/main/java/de/thedevstack/conversationsplus/utils/ImageUtil.java +++ b/src/main/java/de/thedevstack/conversationsplus/utils/ImageUtil.java @@ -1,25 +1,38 @@ package de.thedevstack.conversationsplus.utils; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.media.ExifInterface; import android.net.Uri; +import android.os.AsyncTask; +import android.util.DisplayMetrics; import android.util.LruCache; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.lang.ref.WeakReference; +import java.util.concurrent.RejectedExecutionException; import de.thedevstack.android.logcat.Logging; +import de.thedevstack.conversationsplus.ConversationsPlusApplication; import de.thedevstack.conversationsplus.exceptions.ImageResizeException; import de.thedevstack.conversationsplus.Config; import de.thedevstack.conversationsplus.R; import de.thedevstack.conversationsplus.entities.Message; import de.thedevstack.conversationsplus.persistance.FileBackend; +import de.thedevstack.conversationsplus.utils.ui.ViewUtil; /** * This util provides @@ -373,6 +386,129 @@ public final class ImageUtil { return inSampleSize; } + static class BitmapWorkerTask extends AsyncTask { + private final WeakReference imageViewReference; + private final WeakReference alternativeViewReference; + private final boolean setSize; + private Message message = null; + + public BitmapWorkerTask(ImageView imageView, TextView alternativeView, boolean setSize) { + imageViewReference = new WeakReference<>(imageView); + alternativeViewReference = new WeakReference<>(alternativeView); + this.setSize = setSize; + } + + @Override + protected Bitmap doInBackground(Message... params) { + message = params[0]; + try { + DisplayMetrics metrics = ConversationsPlusApplication.getAppContext().getResources().getDisplayMetrics(); + return ImageUtil.getThumbnail(message, (int) (metrics.density * 288), false); + } catch (FileNotFoundException e) { + return null; + } + } + + @Override + protected void onPostExecute(Bitmap bitmap) { + final ImageView imageView = imageViewReference.get(); + final TextView alternativeView = alternativeViewReference.get(); + if (bitmap != null) { + if (imageView != null) { + imageView.setImageBitmap(bitmap); + imageView.setBackgroundColor(0x00000000); + if (setSize) { + imageView.setLayoutParams(new LinearLayout.LayoutParams( + bitmap.getWidth(), bitmap.getHeight())); + } + ViewUtil.gone(alternativeView); + ViewUtil.visible(imageView); + } + } else { + ViewUtil.visible(alternativeView); + alternativeView.setText(message.getBody()); // TODO Should be the same as MessageAdapter.displayText... or display preview of ConversationAdapter + ViewUtil.gone(imageView); + } + } + } + + public static void loadBitmap(Message message, ImageView imageView, TextView alternativeView, boolean setSize) { + Bitmap bm; + try { + DisplayMetrics metrics = ConversationsPlusApplication.getAppContext().getResources().getDisplayMetrics(); + bm = ImageUtil.getThumbnail(message,(int) (metrics.density * 288), true); + } catch (FileNotFoundException e) { + bm = null; + } + + if (bm != null) { + imageView.setImageBitmap(bm); + imageView.setBackgroundColor(0x00000000); + if (setSize) { + imageView.setLayoutParams(new LinearLayout.LayoutParams( + bm.getWidth(), bm.getHeight())); + } + + ViewUtil.gone(alternativeView); + ViewUtil.visible(imageView); + } else { + if (cancelPotentialWork(message, imageView)) { + imageView.setBackgroundColor(0xff333333); + imageView.setImageDrawable(null); + final BitmapWorkerTask task = new BitmapWorkerTask(imageView, alternativeView, setSize); + final AsyncDrawable asyncDrawable = new AsyncDrawable(ConversationsPlusApplication.getAppContext().getResources(), null, task); + imageView.setImageDrawable(asyncDrawable); + ViewUtil.gone(alternativeView); + ViewUtil.visible(imageView); + try { + task.execute(message); + } catch (final RejectedExecutionException ignored) { + } + } + } + } + + public static boolean cancelPotentialWork(Message message, + ImageView imageView) { + final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); + + if (bitmapWorkerTask != null) { + final Message oldMessage = bitmapWorkerTask.message; + if (oldMessage == null || message != oldMessage) { + bitmapWorkerTask.cancel(true); + } else { + return false; + } + } + return true; + } + + private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { + if (imageView != null) { + final Drawable drawable = imageView.getDrawable(); + if (drawable instanceof AsyncDrawable) { + final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; + return asyncDrawable.getBitmapWorkerTask(); + } + } + return null; + } + + static class AsyncDrawable extends BitmapDrawable { + private final WeakReference bitmapWorkerTaskReference; + + public AsyncDrawable(Resources res, Bitmap bitmap, + BitmapWorkerTask bitmapWorkerTask) { + super(res, bitmap); + bitmapWorkerTaskReference = new WeakReference<>( + bitmapWorkerTask); + } + + public BitmapWorkerTask getBitmapWorkerTask() { + return bitmapWorkerTaskReference.get(); + } + } + private ImageUtil() { // Static helper class } -- cgit v1.2.3