package org.xbmc.android.remote.presentation.widget; import org.xbmc.api.business.CoverResponse; import org.xbmc.api.business.IManager; import org.xbmc.api.type.ThumbSize; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Handler; import android.view.View; public abstract class AbstractItemView extends View { protected final static Paint PAINT = new Paint(); protected final int padding; protected final int size12, size18, size20, size25, size35, size42, size50, size55, size59, size65, size103; public final static int MSG_UPDATE_COVER = 1; protected static Bitmap sSelected; private final CoverResponse mResponse; private final Bitmap mDefaultCover; protected Bitmap mCover; protected final int mWidth; protected final Drawable mSelection; protected int mDefaultColor = Color.WHITE; private final Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case MSG_UPDATE_COVER: setCover((Bitmap)msg.obj); break; } }; }; public int position; public String title; protected abstract Rect getPosterRect(); public AbstractItemView(Context context, IManager manager, int width, Bitmap defaultCover, Drawable selection, int thumbSize, boolean fixedSize) { super(context); if (manager != null) { mResponse = new CoverResponse(context, manager, defaultCover, thumbSize, mHandler); } else { mResponse = null; } mWidth = width; mDefaultCover = defaultCover; mSelection = selection; final float screenScale = fixedSize ? 1 : ThumbSize.SCREEN_SCALE; padding = (int)(5 * ThumbSize.PIXEL_SCALE * screenScale); size12 = (int)(12 * ThumbSize.PIXEL_SCALE * screenScale); size18 = (int)(18 * ThumbSize.PIXEL_SCALE * screenScale); size20 = (int)(20 * ThumbSize.PIXEL_SCALE * screenScale); size25 = (int)(25 * ThumbSize.PIXEL_SCALE * screenScale); size35 = (int)(35 * ThumbSize.PIXEL_SCALE * screenScale); size42 = (int)(42 * ThumbSize.PIXEL_SCALE * screenScale); size50 = (int)(50 * ThumbSize.PIXEL_SCALE * screenScale); size55 = (int)(55 * ThumbSize.PIXEL_SCALE * screenScale); size59 = (int)(59 * ThumbSize.PIXEL_SCALE * screenScale); size65 = (int)(65 * ThumbSize.PIXEL_SCALE * screenScale); size103 = (int)(103 * ThumbSize.PIXEL_SCALE * screenScale); } public AbstractItemView(Context context, int width, Bitmap defaultCover, Drawable selection, boolean fixedSize) { this(context, null, width, defaultCover, selection, 0, fixedSize); } protected void drawPoster(Canvas canvas, int posterWidth, int posterHeight, int canvasWidth) { // background if ((isSelected() || isPressed()) && mSelection != null) { mSelection.setBounds(posterWidth, 0, canvasWidth, posterHeight); mSelection.draw(canvas); } else { PAINT.setColor(mDefaultColor); canvas.drawRect(posterWidth, 0, canvasWidth, posterHeight, PAINT); } // poster Bitmap cover = mCover; if(mCover == null || mCover.isRecycled()) { cover = mDefaultCover; } if (cover != null && !cover.isRecycled()) { int dx = (cover.getWidth() - posterWidth) / 2; int dy = (cover.getHeight() - posterHeight) / 2; Rect src = null; if(dx > 0 || dy > 0) { src = new Rect(dx, dy, dx + posterWidth, dy + posterHeight); } Rect dst = getPosterRect(); PAINT.setColor(mDefaultColor); canvas.drawRect(0, 0, posterWidth, posterHeight, PAINT); canvas.drawBitmap(cover, src, dst, PAINT); } } protected String ellipse(String text, int width) { if (PAINT.measureText(text) <= width) { return text; } for (int i = text.length(); i >= 0; i--) { if (PAINT.measureText(text.substring(0, i).concat("...")) <= width) { return text.substring(0, text.charAt(i - 1) == ' ' ? i - 1 : i).concat("..."); } } return ""; } public void reset() { mCover = null; } public void setCover(Bitmap cover) { mCover = cover; invalidate(); } public int getPosition() { return position; } public boolean hasBitmap() { return mCover != null; } public CoverResponse getResponse() { return mResponse; } }