diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java
index 9c1ecc07..f73ddeb4 100644
--- a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java
+++ b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java
@@ -6,16 +6,23 @@ import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
+import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
+import com.android.volley.NetworkError;
+import com.android.volley.NoConnectionError;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import org.floens.chan.ChanApplication;
+import org.floens.chan.R;
+
+import static org.floens.chan.utils.AndroidUtils.getString;
+import static org.floens.chan.utils.AndroidUtils.sp;
public class ThumbnailView extends View implements ImageLoader.ImageListener {
private ImageLoader.ImageContainer container;
@@ -34,6 +41,10 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener {
BitmapShader bitmapShader;
private Paint roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
+ private boolean error = false;
+ private String errorText;
+ private Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
public ThumbnailView(Context context) {
super(context);
init();
@@ -50,6 +61,8 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener {
}
private void init() {
+ textPaint.setColor(0xff000000);
+ textPaint.setTextSize(sp(14));
}
public void setUrl(String url, int width, int height) {
@@ -60,6 +73,7 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener {
if (container != null) {
container.cancelRequest();
container = null;
+ error = false;
setImageBitmap(null);
}
@@ -84,25 +98,28 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener {
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {
setImageBitmap(response.getBitmap());
-
- clearAnimation();
- if (fadeTime > 0 && !isImmediate) {
- setAlpha(0f);
- animate().alpha(1f).setDuration(fadeTime);
- } else {
- setAlpha(1f);
- }
+ onImageSet(isImmediate);
}
}
@Override
- public void onErrorResponse(VolleyError error) {
- error.printStackTrace();
+ public void onErrorResponse(VolleyError e) {
+ error = true;
+
+ if ((e instanceof NoConnectionError) || (e instanceof NetworkError)) {
+ errorText = getString(R.string.thumbnail_load_failed_network);
+ } else {
+ errorText = getString(R.string.thumbnail_load_failed_server);
+ }
+
+ onImageSet(false);
}
@Override
protected boolean onSetAlpha(int alpha) {
- if (circular) {
+ if (error) {
+ textPaint.setAlpha(alpha);
+ } else if (circular) {
roundPaint.setAlpha(alpha);
} else {
paint.setAlpha(alpha);
@@ -114,45 +131,71 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener {
@Override
protected void onDraw(Canvas canvas) {
- if (bitmap == null || getAlpha() == 0f) {
+ if (getAlpha() == 0f) {
return;
}
- int width = getWidth() - getPaddingLeft() - getPaddingRight();
- int height = getHeight() - getPaddingTop() - getPaddingBottom();
+ if (error) {
+ canvas.save();
- if (calculate) {
- calculate = false;
- bitmapRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight());
- float scale = Math.max(
- (float) width / (float) bitmap.getWidth(),
- (float) height / (float) bitmap.getHeight());
- float scaledX = bitmap.getWidth() * scale;
- float scaledY = bitmap.getHeight() * scale;
- float offsetX = (scaledX - width) * 0.5f;
- float offsetY = (scaledY - height) * 0.5f;
+ Rect bounds = new Rect();
+ textPaint.getTextBounds(errorText, 0, errorText.length(), bounds);
+ float x = (getWidth() - bounds.width()) / 2;
+ float y = getHeight() - (getHeight() - bounds.height()) / 2;
+ canvas.drawText(errorText, x, y, textPaint);
- drawRect.set(-offsetX, -offsetY, scaledX - offsetX, scaledY - offsetY);
- drawRect.offset(getPaddingLeft(), getPaddingTop());
+ canvas.restore();
+ } else {
+ if (bitmap == null) {
+ return;
+ }
+
+ int width = getWidth() - getPaddingLeft() - getPaddingRight();
+ int height = getHeight() - getPaddingTop() - getPaddingBottom();
+
+ if (calculate) {
+ calculate = false;
+ bitmapRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight());
+ float scale = Math.max(
+ (float) width / (float) bitmap.getWidth(),
+ (float) height / (float) bitmap.getHeight());
+ float scaledX = bitmap.getWidth() * scale;
+ float scaledY = bitmap.getHeight() * scale;
+ float offsetX = (scaledX - width) * 0.5f;
+ float offsetY = (scaledY - height) * 0.5f;
+
+ drawRect.set(-offsetX, -offsetY, scaledX - offsetX, scaledY - offsetY);
+ drawRect.offset(getPaddingLeft(), getPaddingTop());
- outputRect.set(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom());
+ outputRect.set(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom());
- matrix.setRectToRect(bitmapRect, drawRect, Matrix.ScaleToFit.FILL);
+ matrix.setRectToRect(bitmapRect, drawRect, Matrix.ScaleToFit.FILL);
+ if (circular) {
+ bitmapShader.setLocalMatrix(matrix);
+ roundPaint.setShader(bitmapShader);
+ }
+ }
+
+ canvas.save();
+ canvas.clipRect(outputRect);
if (circular) {
- bitmapShader.setLocalMatrix(matrix);
- roundPaint.setShader(bitmapShader);
+ canvas.drawRoundRect(outputRect, width / 2, height / 2, roundPaint);
+ } else {
+ canvas.drawBitmap(bitmap, matrix, paint);
}
+ canvas.restore();
}
+ }
- canvas.save();
- canvas.clipRect(outputRect);
- if (circular) {
- canvas.drawRoundRect(outputRect, width / 2, height / 2, roundPaint);
+ private void onImageSet(boolean isImmediate) {
+ clearAnimation();
+ if (fadeTime > 0 && !isImmediate) {
+ setAlpha(0f);
+ animate().alpha(1f).setDuration(fadeTime);
} else {
- canvas.drawBitmap(bitmap, matrix, paint);
+ setAlpha(1f);
}
- canvas.restore();
}
private void setImageBitmap(Bitmap bitmap) {
diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml
index 2fdbaeb2..467d97ac 100644
--- a/Clover/app/src/main/res/values/strings.xml
+++ b/Clover/app/src/main/res/values/strings.xml
@@ -81,6 +81,8 @@ along with this program. If not, see .
Cannot write to storage
Start / stop playing
+ Error
+ 404
Failed to show image
Failed to show image, out of memory
Deepzoom loading failed