/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.ui.view;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import com.galaxy.meetup.client.android.R;
import com.galaxy.meetup.client.android.content.AvatarRequest;
import com.galaxy.meetup.client.android.content.EsAvatarData;
import com.galaxy.meetup.client.android.service.ImageCache;
import com.galaxy.meetup.client.android.service.ImageCache.ImageConsumer;
import com.galaxy.meetup.client.android.service.ImageCache.OnAvatarChangeListener;
/**
*
* @author sihai
*
*/
public class AvatarView extends View implements ImageConsumer,
OnAvatarChangeListener {
private static RectF sBoundsRect = new RectF();
private static Paint sImageSelectedPaint;
private boolean mAllowNonSquare;
private Bitmap mAvatarBitmap;
private final ImageCache mAvatarCache;
private boolean mAvatarInvalidated;
private AvatarRequest mAvatarRequest;
private int mAvatarSize;
private boolean mDimmed;
private String mGaiaId;
private Paint mResizePaint;
private Rect mResizeRectDest;
private Rect mResizeRectSrc;
private boolean mResizeRequired;
private boolean mRound;
private boolean mScale;
private Drawable mSelector;
private int mSizeInPixels;
public AvatarView(Context context) {
this(context, null);
}
public AvatarView(Context context, AttributeSet attributeset) {
this(context, attributeset, 0);
}
public AvatarView(Context context, AttributeSet attributeset, int defStyle) {
super(context, attributeset, defStyle);
boolean flag = true;
Resources resources = context.getResources();
if(sImageSelectedPaint == null) {
Paint paint = new Paint();
sImageSelectedPaint = paint;
paint.setAntiAlias(flag);
sImageSelectedPaint.setStrokeWidth(4F);
sImageSelectedPaint.setColor(resources.getColor(R.color.image_selected_stroke));
sImageSelectedPaint.setStyle(android.graphics.Paint.Style.STROKE);
}
mSelector = resources.getDrawable(R.drawable.stream_list_selector);
mSelector.setCallback(this);
mAvatarCache = ImageCache.getInstance(context);
if(attributeset != null) {
String s = attributeset.getAttributeValue(null, "size");
if(s == null)
throw new RuntimeException("Missing 'size' attribute");
String s1 = attributeset.getAttributeValue(null, "round");
if(s1 != null)
mRound = Boolean.parseBoolean(s1);
String s2 = attributeset.getAttributeValue(null, "scale");
if(s2 != null)
mScale = Boolean.parseBoolean(s2);
if("tiny".equals(s)) {
mAvatarSize = 0;
} else if("small".equals(s)) {
mAvatarSize = 1;
} else if("medium".equals(s)) {
mAvatarSize = 2;
} else {
throw new IllegalArgumentException((new StringBuilder("Invalid avatar size: ")).append(s).toString());
}
mAllowNonSquare = attributeset.getAttributeBooleanValue(null, "allowNonSquare", false);
} else {
mAvatarSize = 2;
}
setAvatarSize(mAvatarSize);
}
protected void drawableStateChanged() {
mSelector.setState(getDrawableState());
invalidate();
super.drawableStateChanged();
}
public final String getGaiaId() {
return mGaiaId;
}
protected void onAttachedToWindow() {
super.onAttachedToWindow();
ImageCache _tmp = mAvatarCache;
ImageCache.registerAvatarChangeListener(this);
}
public void onAvatarChanged(String s) {
if(s != null && s.equals(String.valueOf(mGaiaId)) && mAvatarRequest != null) {
mAvatarInvalidated = true;
invalidate();
}
}
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
ImageCache _tmp = mAvatarCache;
ImageCache.unregisterAvatarChangeListener(this);
}
protected void onDraw(Canvas canvas) {
int i;
if(mAvatarInvalidated && mAvatarRequest != null) {
mAvatarInvalidated = false;
mAvatarCache.refreshImage(this, mAvatarRequest);
}
if(mAvatarBitmap != null) {
if(mDimmed) {
sBoundsRect.set(0.0F, 0.0F, getWidth(), getHeight());
canvas.saveLayerAlpha(sBoundsRect, 105, 31);
}
if(mResizeRequired)
canvas.drawBitmap(mAvatarBitmap, mResizeRectSrc, mResizeRectDest, mResizePaint);
else
canvas.drawBitmap(mAvatarBitmap, 0.0F, 0.0F, null);
if(mDimmed)
canvas.restore();
}
if((isPressed() || isFocused()) && !mDimmed)
if(mRound) {
i = getWidth() / 2;
canvas.drawCircle(i, i, i - 2, sImageSelectedPaint);
} else {
mSelector.draw(canvas);
}
}
protected void onLayout(boolean flag, int i, int j, int k, int l) {
super.onLayout(flag, i, j, k, l);
if(!mRound)
mSelector.setBounds(0, 0, k - i, l - j);
if(mAvatarBitmap == null)
if(mAvatarRequest != null)
mAvatarCache.loadImage(this, mAvatarRequest);
else
setBitmap(null, true);
}
protected void onMeasure(int i, int j) {
int k = mSizeInPixels;
int l = android.view.View.MeasureSpec.getMode(i);
int i1;
int j1;
boolean flag;
if(l == 0x40000000)
k = android.view.View.MeasureSpec.getSize(i);
else
if(l == 0x80000000)
k = Math.min(k, android.view.View.MeasureSpec.getSize(i));
i1 = android.view.View.MeasureSpec.getMode(j);
if(mAllowNonSquare) {
j1 = mSizeInPixels;
if(i1 == 0x40000000 || i1 == 0x80000000)
j1 = Math.min(j1, android.view.View.MeasureSpec.getSize(j));
} else
if(i1 == 0x40000000)
j1 = Math.min(k, android.view.View.MeasureSpec.getSize(j));
else
j1 = Math.min(k, mSizeInPixels);
if(k != mSizeInPixels)
flag = true;
else
flag = false;
mResizeRequired = flag;
if(mResizeRequired) {
if(mResizePaint == null) {
mResizePaint = new Paint(2);
mResizeRectDest = new Rect();
}
mResizeRectDest.set(0, 0, k, j1);
if(mSizeInPixels > k) {
mResizeRectSrc = new Rect();
if(mScale) {
mResizeRectSrc.set(0, 0, mSizeInPixels, mSizeInPixels);
} else {
int k1 = (mSizeInPixels - k) / 2;
int l1 = (k + mSizeInPixels) / 2;
int i2 = (mSizeInPixels - j1) / 2;
int j2 = (j1 + mSizeInPixels) / 2;
mResizeRectSrc.set(k1, i2, l1, j2);
}
} else {
mResizeRectSrc = null;
}
}
setMeasuredDimension(k, j1);
}
public void setAvatarSize(int i) {
mAvatarSize = i;
switch(mAvatarSize) {
case 0:
mSizeInPixels = EsAvatarData.getTinyAvatarSize(getContext());
break;
case 1:
mSizeInPixels = EsAvatarData.getSmallAvatarSize(getContext());
break;
case 2:
mSizeInPixels = EsAvatarData.getMediumAvatarSize(getContext());
break;
default:
mSizeInPixels = EsAvatarData.getMediumAvatarSize(getContext());
break;
}
}
public void setBitmap(Bitmap bitmap, boolean flag) {
if(null != bitmap) {
mAvatarBitmap = bitmap;
return;
}
switch(mAvatarSize) {
case 0:
mAvatarBitmap = EsAvatarData.getTinyDefaultAvatar(getContext(), mRound);
break;
case 1:
mAvatarBitmap = EsAvatarData.getSmallDefaultAvatar(getContext(), mRound);
break;
case 2:
mAvatarBitmap = EsAvatarData.getMediumDefaultAvatar(getContext(), mRound);
break;
default:
mAvatarBitmap = EsAvatarData.getMediumDefaultAvatar(getContext(), mRound);
break;
}
}
public void setDimmed(boolean dimmed) {
mDimmed = dimmed;
invalidate();
}
public void setGaiaId(String s) {
if (!TextUtils.equals(mGaiaId, s)) {
mGaiaId = s;
if (s != null)
mAvatarRequest = new AvatarRequest(s, mAvatarSize, mRound);
else
mAvatarRequest = null;
mAvatarBitmap = null;
requestLayout();
}
}
public void setGaiaIdAndAvatarUrl(String s, String s1) {
if (!TextUtils.equals(mGaiaId, s)) {
mGaiaId = s;
if (s != null)
mAvatarRequest = new AvatarRequest(s, s1, mAvatarSize, mRound);
else
mAvatarRequest = null;
mAvatarBitmap = null;
requestLayout();
}
}
public void setRounded(boolean flag) {
mRound = flag;
}
protected boolean verifyDrawable(Drawable drawable) {
boolean flag;
if (drawable == mSelector)
flag = true;
else
flag = super.verifyDrawable(drawable);
return flag;
}
}