/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.ui.view;
import java.util.Calendar;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.drawable.NinePatchDrawable;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.view.View;
import com.galaxy.meetup.client.android.R;
import com.galaxy.meetup.client.android.content.EsAccount;
import com.galaxy.meetup.client.android.content.EsAvatarData;
import com.galaxy.meetup.client.android.content.EsEventData;
import com.galaxy.meetup.client.android.content.EventThemeImageRequest;
import com.galaxy.meetup.client.android.content.MediaImageRequest;
import com.galaxy.meetup.client.android.service.ImageCache;
import com.galaxy.meetup.client.android.service.ImageCache.OnAvatarChangeListener;
import com.galaxy.meetup.client.android.service.ImageCache.OnMediaImageChangeListener;
import com.galaxy.meetup.client.util.EventDateUtils;
import com.galaxy.meetup.client.util.ImageUtils;
import com.galaxy.meetup.client.util.TextPaintUtils;
import com.galaxy.meetup.client.util.TimeZoneHelper;
import com.galaxy.meetup.server.client.v2.domain.Event;
import com.galaxy.meetup.server.client.v2.domain.HangoutInfo;
import com.galaxy.meetup.server.client.v2.domain.Location;
import com.galaxy.meetup.server.client.v2.domain.ThemeImage;
/**
*
* @author sihai
*
*/
public class EventCardDrawer implements OnAvatarChangeListener,
OnMediaImageChangeListener {
private static Bitmap sAuthorBitmap;
private static int sAvatarSize;
private static Bitmap sBlueRsvpBannerBitmap;
private static Paint sDividerPaint;
private static Bitmap sEventAttendingBitmap;
private static int sEventCardPadding;
private static Paint sEventInfoBackgroundPaint;
private static TextPaint sEventInfoTextPaint;
private static Bitmap sEventMaybeBitmap;
private static TextPaint sEventNameTextPaint;
private static Bitmap sEventNotAttendingBitmap;
private static int sEventTextLineSpacing;
private static Bitmap sGreenRsvpBannerBitmap;
private static Bitmap sGreyRsvpBannerBitmap;
private static Bitmap sHangoutBitmap;
private static String sHangoutTitle;
private static ImageCache sImageCache;
private static boolean sInitialized;
private static Bitmap sLocationBitmap;
private static NinePatchDrawable sOnAirNinePatch;
private static TextPaint sOnAirPaint;
private static String sOnAirTitle;
private static Paint sResizePaint;
private static float sRibbonHeightPercentOverlap;
private static TextPaint sStatusGoingPaint;
private static TextPaint sStatusInvitedPaint;
private static TextPaint sStatusMaybePaint;
private static TextPaint sStatusNotGoingPaint;
EsAccount mAccount;
private CharSequence mAttribution;
private Point mAttributionLayoutCorner;
ClickableUserImage mAvatar;
private boolean mBound;
CardView mContainingCardView;
private StaticLayout mCreatorLayout;
private StaticLayout mDateLayout;
private Point mDateLayoutCorner;
float mDividerLines[];
Event mEventInfo;
private boolean mIgnoreHeight;
private Bitmap mLocationIcon;
private Rect mLocationIconRect;
private StaticLayout mLocationLayout;
private Point mLocationLayoutCorner;
private StaticLayout mNameLayout;
private Point mNameLayoutCorner;
private Bitmap mRsvpBanner;
private Rect mRsvpBannerRect;
private Bitmap mRsvpIcon;
private Rect mRsvpIconRect;
private StaticLayout mRsvpLayout;
private Point mRsvpLayoutCorner;
RemoteImage mThemeImage;
private Rect mThemeImageRect;
ThemeImage mThemeInfo;
private Point mTimeZoneCorner;
private StaticLayout mTimeZoneLayout;
private ClickableButton mTypeLabel;
public EventCardDrawer(View view)
{
TimeZoneHelper.initialize(view.getContext());
if(!sInitialized)
{
Resources resources = view.getResources();
sImageCache = ImageCache.getInstance(view.getContext());
sResizePaint = new Paint(2);
sAvatarSize = (int)resources.getDimension(R.dimen.card_avatar_size);
sRibbonHeightPercentOverlap = resources.getDimension(R.dimen.event_card_ribbon_percent_height_overlap);
sEventCardPadding = (int)resources.getDimension(R.dimen.event_card_padding);
sEventTextLineSpacing = (int)resources.getDimension(R.dimen.event_card_text_line_spacing);
sAuthorBitmap = EsAvatarData.getMediumDefaultAvatar(view.getContext(), true);
Paint paint = new Paint();
sEventInfoBackgroundPaint = paint;
paint.setColor(resources.getColor(R.color.event_info_background_color));
sEventInfoBackgroundPaint.setStyle(android.graphics.Paint.Style.FILL);
TextPaint textpaint = new TextPaint();
sEventNameTextPaint = textpaint;
textpaint.setAntiAlias(true);
sEventNameTextPaint.setColor(resources.getColor(R.color.event_name_text_color));
sEventNameTextPaint.setTextSize(resources.getDimension(R.dimen.event_card_name_text_size));
sEventNameTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
TextPaintUtils.registerTextPaint(sEventNameTextPaint, R.dimen.event_card_name_text_size);
TextPaint textpaint1 = new TextPaint();
sEventInfoTextPaint = textpaint1;
textpaint1.setAntiAlias(true);
sEventInfoTextPaint.setColor(resources.getColor(R.color.card_event_info_text));
sEventInfoTextPaint.setTextSize(resources.getDimension(R.dimen.event_card_info_text_size));
TextPaintUtils.registerTextPaint(sEventInfoTextPaint, R.dimen.event_card_info_text_size);
TextPaint textpaint2 = new TextPaint();
textpaint2.setAntiAlias(true);
textpaint2.setTextSize(resources.getDimension(R.dimen.event_card_status_text_size));
textpaint2.setTypeface(Typeface.DEFAULT_BOLD);
TextPaint textpaint3 = new TextPaint(textpaint2);
sStatusInvitedPaint = textpaint3;
textpaint3.setColor(resources.getColor(R.color.card_event_invited));
TextPaintUtils.registerTextPaint(sStatusInvitedPaint, R.dimen.event_card_status_text_size);
TextPaint textpaint4 = new TextPaint(textpaint2);
sStatusGoingPaint = textpaint4;
textpaint4.setColor(resources.getColor(R.color.card_event_going));
TextPaintUtils.registerTextPaint(sStatusGoingPaint, R.dimen.event_card_status_text_size);
TextPaint textpaint5 = new TextPaint(textpaint2);
sStatusNotGoingPaint = textpaint5;
textpaint5.setColor(resources.getColor(R.color.card_event_not_going));
TextPaintUtils.registerTextPaint(sStatusNotGoingPaint, R.dimen.event_card_status_text_size);
TextPaint textpaint6 = new TextPaint(textpaint2);
sStatusMaybePaint = textpaint6;
textpaint6.setColor(resources.getColor(R.color.card_event_maybe));
TextPaintUtils.registerTextPaint(sStatusMaybePaint, R.dimen.event_card_status_text_size);
TextPaint textpaint7 = new TextPaint(sEventInfoTextPaint);
sOnAirPaint = textpaint7;
textpaint7.setColor(resources.getColor(R.color.event_detail_on_air));
sOnAirPaint.setTextSize(resources.getDimension(R.dimen.event_card_details_on_air_size));
TextPaintUtils.registerTextPaint(sOnAirPaint, R.dimen.event_card_details_on_air_size);
Paint paint1 = new Paint();
sDividerPaint = paint1;
paint1.setColor(resources.getColor(R.color.card_event_divider));
sDividerPaint.setStrokeWidth(resources.getDimension(R.dimen.event_card_divider_stroke_width));
sEventAttendingBitmap = ImageUtils.decodeResource(resources, R.drawable.icn_events_check);
sEventNotAttendingBitmap = ImageUtils.decodeResource(resources, R.drawable.icn_events_not_going);
sEventMaybeBitmap = ImageUtils.decodeResource(resources, R.drawable.icn_events_maybe);
sBlueRsvpBannerBitmap = ImageUtils.decodeResource(resources, R.drawable.icn_events_ribbon_blue);
sGreenRsvpBannerBitmap = ImageUtils.decodeResource(resources, R.drawable.icn_events_ribbon_green);
sGreyRsvpBannerBitmap = ImageUtils.decodeResource(resources, R.drawable.icn_events_ribbon_grey);
sLocationBitmap = ImageUtils.decodeResource(resources, R.drawable.icn_location_card);
sHangoutBitmap = ImageUtils.decodeResource(resources, R.drawable.icn_events_hangout_taco);
sHangoutTitle = resources.getString(R.string.event_hangout_text);
sOnAirTitle = resources.getString(R.string.event_detail_on_air);
sOnAirNinePatch = (NinePatchDrawable)resources.getDrawable(R.drawable.btn_events_on_air);
sInitialized = true;
}
mThemeImageRect = new Rect();
mRsvpIconRect = new Rect();
mRsvpLayoutCorner = new Point();
mRsvpBannerRect = new Rect();
mLocationIconRect = new Rect();
mNameLayoutCorner = new Point();
mDateLayoutCorner = new Point();
mTimeZoneCorner = new Point();
mLocationLayoutCorner = new Point();
mAttributionLayoutCorner = new Point();
mDividerLines = new float[4];
}
private static void drawTextLayout(StaticLayout staticlayout, Point point, Canvas canvas)
{
canvas.translate(point.x, point.y);
staticlayout.draw(canvas);
canvas.translate(-point.x, -point.y);
}
private static StaticLayout layoutTextLabel(int i, int j, int k, CharSequence charsequence, Point point, TextPaint textpaint, boolean flag)
{
return TextPaintUtils.layoutBitmapTextLabel(i, j, k, 0, null, null, 0, charsequence, point, textpaint, flag);
}
public final void attach()
{
ImageCache _tmp = sImageCache;
ImageCache.registerMediaImageChangeListener(this);
ImageCache _tmp1 = sImageCache;
ImageCache.registerAvatarChangeListener(this);
}
public final void bind(EsAccount esaccount, CardView cardview, Event plusevent, ClickableUserImage.UserImageClickListener userimageclicklistener)
{
bind(esaccount, cardview, plusevent, null, null, userimageclicklistener);
}
public final void bind(EsAccount esaccount, CardView cardview, Event plusevent, String s, CharSequence charsequence, ClickableUserImage.UserImageClickListener userimageclicklistener)
{
clear();
mEventInfo = plusevent;
boolean flag;
if(mEventInfo != null)
flag = true;
else
flag = false;
mBound = flag;
if(mBound)
{
mAccount = esaccount;
mContainingCardView = cardview;
mThemeInfo = EsEventData.getThemeImage(mEventInfo.getTheme());
mContainingCardView.removeClickableItem(mAvatar);
CardView cardview1 = mContainingCardView;
String s1;
if(s != null)
s1 = s;
else
s1 = mEventInfo.getPublisher();
mAvatar = new ClickableUserImage(cardview1, s1, null, null, userimageclicklistener, 2);
mAttribution = charsequence;
mContainingCardView.addClickableItem(mAvatar);
}
}
public final void clear()
{
if(mBound)
{
mContainingCardView.removeClickableItem(mAvatar);
mAvatar = null;
mThemeInfo = null;
mEventInfo = null;
mContainingCardView = null;
mAccount = null;
mRsvpIcon = null;
mRsvpBanner = null;
mThemeImage = null;
mThemeImageRect.setEmpty();
mRsvpIconRect.setEmpty();
mRsvpLayoutCorner.set(0, 0);
mRsvpBannerRect.setEmpty();
mLocationIconRect.setEmpty();
mNameLayout = null;
mDateLayout = null;
mTimeZoneLayout = null;
mLocationLayout = null;
mRsvpLayout = null;
mCreatorLayout = null;
mTypeLabel = null;
mLocationIcon = null;
mNameLayoutCorner.set(0, 0);
mDateLayoutCorner.set(0, 0);
mTimeZoneCorner.set(0, 0);
mLocationLayoutCorner.set(0, 0);
mAttributionLayoutCorner.set(0, 0);
mAttribution = null;
mBound = false;
}
}
public final void detach()
{
ImageCache _tmp = sImageCache;
ImageCache.unregisterAvatarChangeListener(this);
ImageCache _tmp1 = sImageCache;
ImageCache.unregisterMediaImageChangeListener(this);
}
public final int draw(int i, int j, Canvas canvas)
{
int k = i;
int l = i + j;
if(mBound)
{
if(mThemeImage != null)
{
mThemeImage.refreshIfInvalidated();
Bitmap bitmap1 = mThemeImage.getBitmap();
if(bitmap1 != null && (mThemeImageRect.bottom <= l || mIgnoreHeight))
canvas.drawBitmap(bitmap1, null, mThemeImageRect, sResizePaint);
}
if(mAvatar != null && (mAvatar.getRect().bottom <= l || mIgnoreHeight))
{
Bitmap bitmap = mAvatar.getBitmap();
if(bitmap == null)
bitmap = sAuthorBitmap;
canvas.drawBitmap(bitmap, null, mAvatar.getRect(), sResizePaint);
if(mAvatar.isClicked())
mAvatar.drawSelectionRect(canvas);
}
if(mRsvpLayout != null && (Math.max(mRsvpBannerRect.bottom, Math.max(mRsvpIconRect.bottom, mRsvpLayoutCorner.y + mRsvpLayout.getHeight())) <= l || mIgnoreHeight))
{
canvas.drawBitmap(mRsvpBanner, null, mRsvpBannerRect, null);
drawTextLayout(mRsvpLayout, mRsvpLayoutCorner, canvas);
if(mRsvpIcon != null)
canvas.drawBitmap(mRsvpIcon, null, mRsvpIconRect, null);
canvas.drawLines(mDividerLines, sDividerPaint);
}
if(mNameLayoutCorner.y + mNameLayout.getHeight() <= l || mIgnoreHeight)
drawTextLayout(mNameLayout, mNameLayoutCorner, canvas);
int i1 = mDateLayoutCorner.y + mDateLayout.getHeight();
if(i1 <= l || mIgnoreHeight)
{
drawTextLayout(mDateLayout, mDateLayoutCorner, canvas);
k = i1;
}
if(mTimeZoneLayout != null)
{
int i2 = mTimeZoneCorner.y + mTimeZoneLayout.getHeight();
if(i2 <= l || mIgnoreHeight)
{
drawTextLayout(mTimeZoneLayout, mTimeZoneCorner, canvas);
k = i2;
}
}
if(mTypeLabel != null)
{
int l1 = mTypeLabel.getRect().bottom;
if(l1 <= l || mIgnoreHeight)
{
mTypeLabel.draw(canvas);
k = l1;
}
}
if(mLocationLayout != null)
{
int k1 = Math.max(mLocationIconRect.bottom, mLocationLayout.getHeight() + mLocationLayoutCorner.y);
if(k1 <= l || mIgnoreHeight)
{
drawTextLayout(mLocationLayout, mLocationLayoutCorner, canvas);
canvas.drawBitmap(mLocationIcon, null, mLocationIconRect, null);
k = k1;
}
}
if(mAttribution != null)
{
int j1 = mAttributionLayoutCorner.y + mCreatorLayout.getHeight();
if(j1 <= l || mIgnoreHeight)
{
drawTextLayout(mCreatorLayout, mAttributionLayoutCorner, canvas);
k = j1;
}
}
i = k;
}
return i;
}
public final int layout(int i, int j, boolean flag, int k, int l)
{
if(null == mContainingCardView || !mBound) {
return 0;
}
int j1;
int l1;
int i3;
int j3;
int k3;
Context context;
Object obj;
TextPaint textpaint;
int i4;
int j4;
int k4;
int l4;
int i5;
int j5;
int l6;
String s2;
mIgnoreHeight = flag;
j1 = sEventCardPadding;
int k1 = j1 * 2;
l1 = sEventTextLineSpacing;
int i2 = Math.round((float)k / 3.36F);
if((mThemeImage == null || mThemeImageRect.width() != k || mThemeImageRect.height() != i2 || mThemeImageRect.top != j || mThemeImageRect.left != i) && mThemeInfo != null)
{
mThemeImageRect.set(i, j, i + k, j + i2);
EventThemeImageRequest eventthemeimagerequest = new EventThemeImageRequest(ImageUtils.getCenterCroppedAndResizedUrl(k, i2, mThemeInfo.getUrl()));
mThemeImage = new RemoteImage(mContainingCardView, eventthemeimagerequest);
mThemeImage.load();
}
int j2 = sAvatarSize;
int k2 = i + j1;
int l2 = (j + i2) - k1;
mAvatar.setRect(k2, l2, k2 + j2, l2 + j2);
i3 = j1 + (k2 + j2);
j3 = j + i2;
k3 = (i + k) - i3 - k1;
context = mContainingCardView.getContext();
int k5 = 0;
if(EsEventData.canRsvp(mEventInfo)) {
obj = null;
textpaint = null;
switch(EsEventData.getRsvpStatus(mEventInfo)) {
case 0:
obj = context.getString(R.string.card_event_invited_prompt);
textpaint = sStatusInvitedPaint;
mRsvpBanner = sBlueRsvpBannerBitmap;
break;
case 1:
obj = context.getString(R.string.card_event_going_prompt);
textpaint = sStatusGoingPaint;
mRsvpIcon = sEventAttendingBitmap;
mRsvpBanner = sGreenRsvpBannerBitmap;
break;
case 2:
obj = context.getString(R.string.card_event_maybe_prompt);
textpaint = sStatusMaybePaint;
mRsvpIcon = sEventMaybeBitmap;
mRsvpBanner = sBlueRsvpBannerBitmap;
break;
case 3:
obj = context.getString(R.string.card_event_declined_prompt);
textpaint = sStatusNotGoingPaint;
mRsvpIcon = sEventNotAttendingBitmap;
mRsvpBanner = sGreyRsvpBannerBitmap;
break;
default:
break;
}
i4 = Math.round(sRibbonHeightPercentOverlap * (float)mRsvpBanner.getHeight());
j4 = j3 - i4;
mRsvpBannerRect.set((i3 + k3) - mRsvpBanner.getWidth(), j4, i3 + k3, j4 + mRsvpBanner.getHeight());
k4 = k3 - mRsvpBannerRect.width() - j1;
mRsvpLayout = TextPaintUtils.layoutBitmapTextLabel(i3, j3 + j1, k4, 0, mRsvpIcon, mRsvpIconRect, j1, ((CharSequence) (obj)), mRsvpLayoutCorner, textpaint, true);
l4 = (mRsvpLayoutCorner.y + mRsvpLayout.getHeight()) - j3;
if(mRsvpIcon != null)
i5 = mRsvpIconRect.bottom - j3;
else
i5 = 0;
j5 = j1 + (j3 + Math.max(l4, i5));
mDividerLines[0] = i3;
mDividerLines[1] = j5;
mDividerLines[2] = k4 + i3;
mDividerLines[3] = j5;
k5 = Math.max(j5 - j3, mRsvpBannerRect.height() - i4);
}
int l5 = j1 + (k5 + j3);
mNameLayout = layoutTextLabel(i3, l5, k3, mEventInfo.getName(), mNameLayoutCorner, sEventNameTextPaint, true);
int i6 = l5 + mNameLayout.getHeight();
if(mAttribution != null)
{
int k7 = i6 + l1;
mCreatorLayout = layoutTextLabel(i3, k7, k3, mAttribution, mAttributionLayoutCorner, sEventInfoTextPaint, false);
i6 = k7 + mCreatorLayout.getHeight();
}
int j6 = i6 + l1;
mDateLayout = layoutTextLabel(i3, j6, k3, EventDateUtils.getSingleDisplayLine(mContainingCardView.getContext(), mEventInfo.getStartTime(), null, false, null), mDateLayoutCorner, sEventInfoTextPaint, true);
int k6 = j6 + mDateLayout.getHeight();
boolean flag1 = EsEventData.isEventHangout(mEventInfo);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(mEventInfo.getStartTime().getTimeMs().longValue());
String s = TimeZoneHelper.getDisplayString(mEventInfo.getStartTime().getTimezone(), calendar, flag1);
if(s != null)
{
int j7 = k6 + l1;
mTimeZoneLayout = layoutTextLabel(i3, j7, k3, s, mTimeZoneCorner, sEventInfoTextPaint, true);
k6 = j7 + mTimeZoneLayout.getHeight();
}
if(flag1)
{
int i7 = k6 + l1;
mTypeLabel = new ClickableButton(mContainingCardView.getContext(), null, sOnAirTitle, sOnAirPaint, sOnAirNinePatch, sOnAirNinePatch, null, i3, i7);
k6 = i7 + mTypeLabel.getRect().height();
}
Location location = mEventInfo.getLocation();
HangoutInfo hangoutinfo = mEventInfo.getHangoutInfo();
String s1;
if(location != null)
{
s2 = location.buildAddress();
mLocationIcon = sLocationBitmap;
s1 = s2;
} else
{
s1 = null;
if(hangoutinfo != null)
{
s1 = sHangoutTitle;
mLocationIcon = sHangoutBitmap;
}
}
if(s1 != null)
{
l6 = k6 + l1;
mLocationLayout = TextPaintUtils.layoutBitmapTextLabel(i3, l6, k3, 0, mLocationIcon, mLocationIconRect, j1, s1, mLocationLayoutCorner, sEventInfoTextPaint, true);
k6 = l6 + mLocationLayout.getHeight();
}
return (j3 + (k6 - j3)) - j;
}
public final void onAvatarChanged(String s)
{
if(mAvatar != null)
mAvatar.onAvatarChanged(s);
}
public final void onMediaImageChanged(String s)
{
if(mEventInfo != null && mThemeImage != null && MediaImageRequest.areCanonicallyEqual((MediaImageRequest)mThemeImage.getRequest(), s))
mThemeImage.invalidate();
}
}