/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.view; import WriteReviewOperation.MediaRef; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import com.galaxy.meetup.client.android.EsApplication; import com.galaxy.meetup.client.android.common.Recyclable; import com.galaxy.meetup.client.android.content.DbEmbedEmotishare; import com.galaxy.meetup.client.android.service.ImageResourceManager; import com.galaxy.meetup.client.android.service.Resource; import com.galaxy.meetup.client.util.GifDrawable; import com.galaxy.meetup.client.util.GifImage; import com.galaxy.meetup.client.util.Property; /** * * @author sihai * */ public class EmotiShareCardView extends StreamCardView { private static boolean sImageCardViewInitialized; private static ImageResourceManager sImageResourceManager; private Drawable mAnimatedDrawable; protected Resource mAnimatedImageResource; protected DbEmbedEmotishare mDbEmbedEmotiShare; protected Rect mDestRect; private RectF mDestRectF; private boolean mIsShowingBitmap; private boolean mIsShowingDrawable; private Matrix mMatrix; private Matrix mMatrixInverse; protected MediaRef mMediaRef; protected Rect mSrcRect; private RectF mSrcRectF; protected Resource mStaticImageResource; public EmotiShareCardView(Context context) { this(context, null); } public EmotiShareCardView(Context context, AttributeSet attributeset) { super(context, attributeset); mSrcRect = new Rect(); mDestRect = new Rect(); mDestRectF = new RectF(); mSrcRectF = new RectF(); mMatrix = new Matrix(); mMatrixInverse = new Matrix(); if(!sImageCardViewInitialized) { sImageCardViewInitialized = true; sImageResourceManager = ImageResourceManager.getInstance(context); } } private boolean hasBitmap(Resource resource) { boolean flag; if(hasImage(resource) && (resource.getResource() instanceof Bitmap)) flag = true; else flag = false; return flag; } private static boolean hasImage(Resource resource) { boolean flag = true; if(resource == null || resource.getStatus() != 1) flag = false; return flag; } private static boolean isAnimationSupported() { boolean flag; if(Property.ENABLE_STREAM_GIF_ANIMATION.getBoolean() && EsApplication.sMemoryClass >= 64) flag = true; else flag = false; return flag; } protected final int draw(Canvas canvas, int i, int j, int k, int l) { boolean flag; flag = hasBitmap(mStaticImageResource); boolean flag1; boolean flag2; Drawable drawable; if(mAnimatedDrawable == null) { Resource resource = mAnimatedImageResource; boolean flag3; if(hasImage(resource) && (resource.getResource() instanceof GifImage)) flag3 = true; else flag3 = false; if(flag3) { mSrcRect.setEmpty(); mAnimatedDrawable = new GifDrawable((GifImage)mAnimatedImageResource.getResource()); ((GifDrawable)mAnimatedDrawable).setAnimationEnabled(isAnimationSupported()); mAnimatedDrawable.setCallback(this); } } drawable = mAnimatedDrawable; if(drawable != null && (!(drawable instanceof GifDrawable) || ((GifDrawable)drawable).isValid())) flag1 = true; else flag1 = false; if(flag || flag1) flag2 = true; else flag2 = false; drawMediaTopAreaStage(canvas, k, l, flag2, mDestRect, sMediaTopAreaBackgroundPaint); if(!flag1) { if(flag) { Bitmap bitmap; if(hasBitmap(mStaticImageResource)) { mSrcRect.setEmpty(); bitmap = (Bitmap)mStaticImageResource.getResource(); } else { bitmap = null; } if(bitmap != null) { if(mIsShowingDrawable) mSrcRect.setEmpty(); if(mSrcRect.isEmpty()) createSourceRectForMediaImage(mSrcRect, bitmap, k, l); canvas.drawBitmap(bitmap, mSrcRect, mDestRect, sResizePaint); mIsShowingBitmap = true; mIsShowingDrawable = false; } } } else { if(drawable != null) { if(mIsShowingBitmap) mSrcRect.setEmpty(); if(mSrcRect.isEmpty()) { createSourceRectForMediaImage(mSrcRect, drawable, k, l); mSrcRectF.set(mSrcRect); mDestRectF.set(mDestRect); mMatrix.setRectToRect(mSrcRectF, mDestRectF, android.graphics.Matrix.ScaleToFit.CENTER); if(!mMatrix.invert(mMatrixInverse)) mMatrixInverse.reset(); } drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); canvas.concat(mMatrix); drawable.draw(canvas); canvas.concat(mMatrixInverse); mIsShowingBitmap = false; mIsShowingDrawable = true; } } drawMediaTopAreaShadow(canvas, k, l); drawTagBarIconAndBackground(canvas, i, j); drawPlusOneBar(canvas); drawMediaBottomArea(canvas, i, k, l); drawCornerIcon(canvas); return l; } public final void init(Cursor cursor, int i, int j, android.view.View.OnClickListener onclicklistener, ItemClickListener itemclicklistener, StreamCardView.ViewedListener viewedlistener, StreamCardView.StreamPlusBarClickListener streamplusbarclicklistener, StreamCardView.StreamMediaClickListener streammediaclicklistener) { super.init(cursor, i, j, onclicklistener, itemclicklistener, viewedlistener, streamplusbarclicklistener, streammediaclicklistener); byte abyte0[] = cursor.getBlob(28); if(abyte0 != null) { mDbEmbedEmotiShare = DbEmbedEmotishare.deserialize(abyte0); if(mDbEmbedEmotiShare != null) mMediaRef = mDbEmbedEmotiShare.getImageRef(); } } public void invalidateDrawable(Drawable drawable) { if(drawable == mAnimatedDrawable) invalidate(); else super.invalidateDrawable(drawable); } protected final int layoutElements(int i, int j, int k, int l) { int i1 = k + sXDoublePadding; int j1 = (int)((float)(l + sYDoublePadding) * getMediaHeightPercentage()); mBackgroundRect.set(0, j1, getMeasuredWidth(), getMeasuredHeight()); createTagBar(i, j, k); createPlusOneBar(i, (j1 + sTopBorderPadding) - sYPadding, k); createMediaBottomArea(i, j, k, l); mSrcRect.setEmpty(); mDestRect.set(sLeftBorderPadding, sTopBorderPadding, i1 + sLeftBorderPadding, j1 + sTopBorderPadding); return l; } protected final void onBindResources() { super.onBindResources(); if(mMediaRef != null) { if(isAnimationSupported()) mAnimatedImageResource = sImageResourceManager.getMedia(mMediaRef, 1, 4, this); mStaticImageResource = sImageResourceManager.getMedia(mMediaRef, 3, 0, this); } } public void onRecycle() { super.onRecycle(); mDbEmbedEmotiShare = null; mMediaRef = null; mSrcRect.setEmpty(); mDestRect.setEmpty(); mSrcRectF.setEmpty(); mDestRectF.setEmpty(); mMatrix.reset(); } protected final void onUnbindResources() { super.onUnbindResources(); if(mStaticImageResource != null) { mStaticImageResource.unregister(this); mStaticImageResource = null; } if(mAnimatedImageResource != null) { mAnimatedImageResource.unregister(this); mAnimatedImageResource = null; } if(mAnimatedDrawable != null) { mAnimatedDrawable.setCallback(null); if(mAnimatedDrawable instanceof Recyclable) ((Recyclable)mAnimatedDrawable).onRecycle(); } mAnimatedDrawable = null; } protected boolean verifyDrawable(Drawable drawable) { boolean flag; if(drawable == mAnimatedDrawable) flag = true; else flag = super.verifyDrawable(drawable); return flag; } }